// hik_camera_controller.cpp
#include "hik_camera_controller.h"
#include "global_logger.h"

HikCameraController::HikCameraController(QObject *parent) : QObject(parent)
{
    LOG_INFO("初始化海康威视摄像头控制器");
    
    // SDK初始化
    if(!NET_DVR_Init()) {
        emit errorOccurred(QString("SDK初始化失败：%1").arg(NET_DVR_GetLastError()));
        LOG_ERROR("SDK初始化失败，错误码: {}", NET_DVR_GetLastError());
        return;
    }
    LOG_DEBUG("SDK初始化成功");
    
    // 设置连接超时时间
    if(!NET_DVR_SetConnectTime(2000, 3)) {
        LOG_WARN("设置连接超时时间失败，错误码: {}", NET_DVR_GetLastError());
    }
    
    // 尝试登录设备
    if(loginDevice("192.168.1.64", "admin", "Lssec_12")) {
        LOG_INFO("摄像头设备登录成功");
    } else {
        LOG_ERROR("摄像头设备登录失败");
    }
}

HikCameraController::~HikCameraController()
{
    LOG_INFO("销毁海康威视摄像头控制器");
    
    // 清理资源
    if (m_userId >= 0) {
        NET_DVR_Logout(m_userId);
        LOG_DEBUG("设备已登出");
    }
    NET_DVR_Cleanup();
    LOG_DEBUG("SDK清理完成");
}

bool HikCameraController::loginDevice(const QString &ip, const QString &username, const QString &password)
{
    LOG_DEBUG("尝试登录摄像头设备 - IP: {}, 用户名: {}", 
                        ip.toStdString(), username.toStdString());
    
    // 设置设备登录信息
    NET_DVR_USER_LOGIN_INFO loginInfo = {0};
    NET_DVR_DEVICEINFO_V40 deviceInfo = {0};
    
    strncpy(loginInfo.sDeviceAddress, ip.toUtf8().constData(), NET_DVR_DEV_ADDRESS_MAX_LEN);
    strncpy(loginInfo.sUserName, username.toUtf8().constData(), NAME_LEN);
    strncpy(loginInfo.sPassword, password.toUtf8().constData(), PASSWD_LEN);
    loginInfo.wPort = 8000;  // 默认端口
    loginInfo.bUseAsynLogin = false;  // 同步登录
    
    // 登录设备
    m_userId = NET_DVR_Login_V40(&loginInfo, &deviceInfo);
    if (m_userId < 0) {
        emit errorOccurred(QString("设备登录失败：%1").arg(NET_DVR_GetLastError()));
        LOG_ERROR("设备登录失败，错误码: {}", NET_DVR_GetLastError());
        return false;
    }
    
    LOG_INFO("设备登录成功 - 用户ID: {}", m_userId);
    
    /*
    if (m_userId >= 0) {
        // 从嵌套结构体获取通道信息
        int analogChannels = deviceInfo.struDeviceV30.byChanNum;    // 模拟通道
        int ipChannels = deviceInfo.struDeviceV30.byIPChanNum;      // IP通道
        int totalChannels = analogChannels + ipChannels;           // 总通道数
        
        qDebug() << "模拟通道数:" << analogChannels 
                 << "IP通道数:" << ipChannels 
                 << "总通道数:" << totalChannels;
    }
    */
    return true;
}

void HikCameraController::controlPTZ(int command, int speed)
{
    LOG_DEBUG("控制云台 - 命令: {}, 速度: {}", command, speed);
    
    if (m_userId < 0) {
        emit errorOccurred("云台控制失败：请先登录设备");
        LOG_WARN("云台控制失败：未登录设备");
        return;
    }
    
    // 通道号固定为1（根据实际情况调整）
    int channel = 1;
    // 控制云台
    if(!NET_DVR_PTZControlWithSpeed_Other(m_userId, channel, command, 0, speed)){
        emit errorOccurred(QString("云台控制失败：%1").arg(NET_DVR_GetLastError()));
        LOG_ERROR("云台控制失败，错误码: {}", NET_DVR_GetLastError());
    } else {
        LOG_DEBUG("云台控制成功 - 用户ID: {}, 通道: {}, 命令: {}, 速度: {}", 
                            m_userId, channel, command, speed);
    }
}

void HikCameraController::logoutDevice()
{
    if (m_userId >= 0) {
        NET_DVR_Logout(m_userId);
        m_userId = -1;
        LOG_INFO("设备已登出");
    }
}